package com.example.vue_shop.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.example.vue_shop.components.user.entity.User;

import java.util.Calendar;
import java.util.Map;

/**
 * @author lipengwei
 */
public class JwtUtils {

    /**
     * 加解密秘钥.
     */
    private static final String SIGN = "@vue_shop";
    /**
     * 过期时间.
     */
    private static final int SECONDS = 1800;

    /**
     * 生成Token.
     * @param header 生成 token 的 头部信息
     * @param map token中需要加入的信息
     * @return token
     */
    public static String getToken(Map<String, Object> header,
                                  User user) throws IllegalAccessException {

        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND, SECONDS);

        // 创建 jwt builder
        JWTCreator.Builder builder = JWT.create();

        return builder
                // 指定头
                .withHeader(header)
                // 指定令牌过期时间
                .withExpiresAt(calendar.getTime())
                .withClaim("user", MapUtils.objectToMap(user))
                // 指定签名
                .sign(Algorithm.HMAC256(SIGN))
                // 指定属性
                ;
    }

    /**
     * 验证 token 是否合法.
     * @param token 需要验证的token
     * @return DecodedJWT token 信息
     */
    public static DecodedJWT verify(String token) {
        return JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
    }

}
